﻿namespace est8
{
    internal class class8
    {
        #region     知识点一   学习ref和out的原因
        //他们可以解决  在函数内部改变外部传入的内容  里面变了，外面也要变

        static void ChangeValue(int value)
        {
            value = 3;
        }
        static void ChangeArrayValue(int[] arr)
        {
            arr[0] = 99;
        }

        static void ChangeArray(int[] arr)
        {
            arr=new int[] { 10,20,30 };
        }
        #endregion

        #region     知识点二   ref和out的使用
        //函数参数的修饰符
        //当传入的值类型参数在内部修改时 或者引用类型参数在内部重新申明时
        //外部的值会发生变化

        //ref使用   （ps:out在用法上和ref一样，所以略）
        static void ChangeValueRef(ref int value)
        {
            value = 3;
        }

        static void ChangeArrayRef(ref int[] arr)
        {
            arr = new int[] { 100, 200 };
        }
        #endregion

        #region     知识点三   ref和out的区别
        //1.ref传入的变量必须初始化  out不用（买票上车）
        //2.out传入的能量必须在内部赋值  ref不用（上车买票）

        //ref传入的变量必须初始化 但是在内部 可改可不改
        //out传入的变量不用初始化 但是在内部 必须修改该值（必须赋值）

        #endregion
        static void Main(string[] args)
        {
            Console.WriteLine("ref和out");

            int a = 1;
            ChangeValue(a);
            Console.WriteLine(a);

            int[] arr2 = { 1, 2, 3 };
            ChangeArrayValue(arr2);
            Console.WriteLine(arr2[0]);
            //这里打印的是99不是1是因为：
            //数组arr2进入到函数里后又在函数里修改了值

            ChangeArray(arr2);
            Console.WriteLine(arr2[0]);//99
            //因为arr2进入函数之后还跟上一个老arr一个地址，所以arr[0]=99
            //但进入函数之后 有了新arr，arr房间地址改变到新arr，但是arr2的地址还是老arr，所以arr[0]还是99不变

            Console.WriteLine("*******************");
            a = 2;
            ChangeValue(a);
            Console.WriteLine(a);//2
            ChangeValueRef(ref a);//3   ref值不变，外面与里面保持一致
            Console.WriteLine(a);

            ChangeArray(arr2);
            Console.WriteLine(arr2[0]);//99
            ChangeArrayRef(ref arr2);
            Console.WriteLine(arr2[0]);//100   原理同上
        }
    }
}
